#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

#define TASK_NUM 2

typedef void(*tskPtr)();


void download()
{
    printf("this is a download\n");
}

void show()
{
    printf("this is a show info \n");
}

void InitialTasks(tskPtr task[],int num)
{
    for(int i = 0;i<num;i++) task[i] = NULL;
}

int AddTask(tskPtr task[],tskPtr t)
{
    for(int i= 0;i<TASK_NUM;i++)
    {
        if(task[i]==NULL)
        {
            task[i] = t;
            return 1;
        }
    }
    return 1;
}

void executeTask(tskPtr task[],int num)
{
    for(int i = 0;i<num;i++)
    {
        task[i]();
    }
}

int main()
{
    tskPtr task[TASK_NUM];
    InitialTasks(task,TASK_NUM);
    AddTask(task,download);
    AddTask(task,show);
    
    pid_t pid = fork();
    if(pid==0)
    {
       int cnt=10;
       while(--cnt)
       {
            sleep(1);
            printf("I am child process ,pid is %d,time left is %d\n",getpid(),cnt);
       }

            exit(0);
    }
    else{
        //father
        pid_t rid;
        while(1)
        {
            int status = 0;
            rid = waitpid(pid,&status,1);
            if(rid>0)
            {
                sleep(1);
                printf("child process success,exit code: %d,exit signal:%d\n",(status>>8)&0xFF,status&0x7F);
                break;
            }
            else if(rid==0)
            {
                sleep(1);
                executeTask(task,TASK_NUM);
                printf("wait child proceess ,father can do others\n");
            }
            else{
                sleep(1);
                printf("wait flase,rid id%d\n",rid);
                break;
            }
        }
    }
    return 0;
}
//void Worker(int i)
//{
//    for(int i = 0;i<2;i++)
//    {
//        printf("I am a child process,pid is %d,ppid is %d\n",getpid(),getppid());
//        sleep(1);
//    }
//}
//
//int main()
//{
//    for(int i = 0;i<10;i++)
//    {
//        pid_t id = fork();
//        if(id==0)
//        {
//            //child
//            Worker(i);
//            exit(i);
//        }
//    }
//    for(int i = 0;i<10;i++)
//    {
//        int status;
//        pid_t rid = waitpid(-1,&status,0);//pid is always larger than 1, -1 is the wait child process can be anyone
//        if(rid>0)
//        {
//            printf("child process id:: %d<< success\n",status>>8);
//        }
//    }
//
//    return 0;
//}
//void Worker()
//{
//    for(int cnt = 0;cnt<5;cnt++)
//    {
//        int a = 1;
//        // a/=0;//测试信号码
//        printf(" child process,pid is %d ,ppid is %d \n",getpid(),getppid());
//        sleep(1);
//    }
//}
//int main()
//{
//     pid_t pid = fork();
//
//    if(pid==0)
//    {
//
//        //child process
//        Worker();
//        exit(0);
//    }
//    else{
//        sleep(10);
//       // pid_t rid = wait(NULL);//NULL表示不在乎子进程进行情况
//       int status = 0;
//       pid_t rid = waitpid(pid,&status,0);//pid,表示进行阻塞形式等待
//       printf("%d",status);
//        if(rid == pid)
//        {
//            printf("wait success ,pid : %d,exitsig:%d,exit code:%d",getpid(),status&0x7F,(status>>8)&0xFF);
//        }
//    }
//    return 0;
//}
//int fun()
//{
//    printf("this fun is called\n");
//    //exit(11);//直接终止,you can see the exit code by the "echo $? following the process exited"
//    //_exit(101);
//    return 123;
//}
//int main()
//{
//
//   // fun();
//    printf("pid is %d,ppid is%d ",getpid(),getppid());
//    sleep(3);
///// exit(100);
//    _exit(-1);
//    return 32;//you can see the exit code by the "echo $? following the process exited"
//}
